package com.cskaoyan.javase.oop2.encapsulate._2polymorphic._4instanceof;

/**
 * 在Java当中,需要一种语法来判断是否能够进行强转,这需要使用instanceof关键字
 *
 * 该关键字的使用语法是:
 * 引用 instanceof 类名
 * 这个语法结构,表示判断引用所指向的对象,是否是后面类名的对象或者子类对象
 * 如果是,则该结构的结果是true,否则结果就是false,开发中普遍结合if使用
 * 细节:
 * 如果引用是null,null instanceof 任何类名 结果都是false 这里不会产生空指针异常
 *
 * 该语法怎么来判断能够进行强转呢?
 * 如果该语法结构的结果是true,那么结构后面的"类名"类型的引用都可以指向前面"引用"所指向的对象
 * 这意味着可以把前面的"引用"强转成后面"类名"的类型
 * 总之,该结构返回true,表示可以强转,否则表示不能强转.
 *
 * 强调:
 *      在开发中,做向下转型,除非百分百确信不会出问题
 *      否则建议在做强转之前用instanceof判断一下
 *
 *
 * @since 14:33
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Father f = new Father();
        // 想强转成哪个类型,类名就写在后面
        if (f instanceof Son) {
            Son s = (Son) f;
        }

        Father f2 = new Grandson();
        if (f2 instanceof Son) {
            Son s = (Son) f2;
            System.out.println(s);
        }

        if (f2 instanceof Son2) {
            Son2 s = (Son2) f2;
            System.out.println(s);
        }

        if (f2 instanceof Grandson) {
            Grandson gs = (Grandson) f2;
            System.out.println(gs);
        }
    }
}

class Father {
}

class Son extends Father {
}

class Son2 extends Father {
}

class Grandson extends Son {
}